

function foo(x) {
  console.log(this.a, x);
}
const obj = {
  a: 1
}
Function.prototype.myCall = function (...args) {
  // context 接收需要被绑定的对象
  const context = args[0]

  // 因为第一个参数是要绑定的对象，所以要从第二位开始接收
  const arg = args.slice(1)  //接收第二位以后的全部参数

  // 由于call是由需要绑定的函数调用的，所以this --> foo函数对象
  context.fn = this        // 将 foo引用到 obj 上

  // 让 context 调用foo（此时 fn = foo ），并将结果保存到 res 中
  const res = context.fn(...arg)

  //引用到 obj 后 obj 对象会增加一个函数，则需要移除 obj 上的 foo
  delete context.fn

  return res      //返回前面保存的结果
}
foo.myCall(obj, 2)   //1 2
